//
//  ViewController.m
//  26-GCD
//
//  Created by mafeng on 16/8/18.
//  Copyright © 2016年 mafeng. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1. GCD Grand(伟大的) Central(中央的) Dispatch(调度)
    // 2. GCD的核心概念: 队列, 任务拆分分配到队列中, 系统会自动为我们创建线程和调度线程, 自动
    // 3. GCD中的队列严格遵循FIFO(先进先出)原则
    //    队列分类
    //    1. 串行 DISPATCH_QUEUE_SERIAL / NULL
    //    2. 并发 DISPATCH_QUEUE_CONCURRENT
    
    // 4. 队列的创建
    //  1>队列名
    //  2>队列类型
    // 串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", NULL);
    // 并发队列
    dispatch_queue_t concurentQueue = dispatch_queue_create("concurentQueue", DISPATCH_QUEUE_CONCURRENT);
    // 系统提供的队列
    // 主队列 是 串行
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 全局队列
    // 参数1: 调度队列优先级
    // 参数2: 给未来使用, 占位使用, 填0
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 术语:
    // 串行: 一个任务执行完毕, 在执行下一个
    // 并发: 多个任务同时执行
    
    // 5. 同步 异步
    // 同步 在当天线程执行任务, 不能开辟线程
    // 异步 在新的线程执行任务, 可以开辟线程
    // 同⃣步⃣:
    // 同步 串行队列 不会创建线程
     [self syncSerialQueue:serialQueue];
    // 同步 并发队列 不会创建线程
    // [self syncconcurentQueue:concurentQueue];
    // 同步 并发队列 不会创建线程
    
    // 同步 主线程队列 不会创建线程
    // [self syncmainQueue:mainQueue];
    // 主线程 同步 主线程
    // 主线程等待同步操作结束, 同步操作在主线程中执行, 互相等待, 导致程序卡死
    
    // 同步 全局队列
    // [self syncGlobalQueue:globalQueue];
    
    // 异⃣步⃣:
    // [self asyncSerialQueue:serialQueue];
    
    // [self asyncconcurentQueue:concurentQueue];
    
    // [self asyncmainQueue:mainQueue];
    
    // [self asyncGlobalQueue:globalQueue];
    
    // 6. group 组
    //  1> 组的创建
    //  2> 组只有异步
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, concurentQueue, ^{
        NSLog(@"group1===%@", [NSThread mainThread]);
        
    });
    
    dispatch_group_async(group, concurentQueue, ^{
        NSLog(@"group1===%@", [NSThread mainThread]);
        
    });
    
    dispatch_group_async(group, concurentQueue, ^{
        NSLog(@"group2===%@", [NSThread mainThread]);
        
    });
    
    dispatch_group_async(group, concurentQueue, ^{
        NSLog(@"group3===%@", [NSThread mainThread]);
        
    });
    //  3> 所有任务都执行完毕, 会调用下面的方法0
    dispatch_group_notify(group, mainQueue, ^{
        NSLog(@"所有操作执行完时, 刷新");
    });
    
}

- (void)syncSerialQueue:(dispatch_queue_t)serialQueue {
    // block中的内容会追加到队列中
    for (int i = 0; i < 10; i++) {
        NSLog(@"同步串行队列");
        dispatch_sync(serialQueue, ^{
            NSLog(@"serialQueue:%d===%@", i, [NSThread currentThread]);
        });
    }
}

- (void)syncconcurentQueue:(dispatch_queue_t)concurentQueue {
    NSLog(@"同步并发队列");
    for (int i = 0; i < 10; i++) {
        dispatch_sync(concurentQueue, ^{
            NSLog(@"concurentQueue:%d===%@", i, [NSThread currentThread]);
        });
    }
}

- (void)syncmainQueue:(dispatch_queue_t)mainQueue {
    NSLog(@"同步主线程队列");
    for (int i = 0; i < 10; i++) {
        dispatch_sync(mainQueue, ^{
            NSLog(@"main:%d===%@", i, [NSThread currentThread]);
        });
    }
}

- (void)syncGlobalQueue:(dispatch_queue_t)globalQueue {
    NSLog(@"同步全局队列");
    for (int i = 0; i < 10; i++) {
        dispatch_sync(globalQueue, ^{
            NSLog(@"globalQueue:%d===%@", i, [NSThread currentThread]);
        });
    }
}
// 异步串行队列, 创建一个新的线程, 在该线程中执行
- (void)asyncSerialQueue:(dispatch_queue_t)serialQueue {
    
    NSLog(@"异步串行队列");
    for (int i = 0; i < 10; i++) {
        dispatch_async(serialQueue, ^{
            NSLog(@"serialQueue:%d===%@", i, [NSThread currentThread]);
        });
    }
}

// 异步 并发队列 根据任务决定创建多少线程
- (void)asyncconcurentQueue:(dispatch_queue_t)concurentQueue {
    NSLog(@"异步并发队列");
    for (int i = 0; i < 10; i++) {
        dispatch_async(concurentQueue, ^{
            NSLog(@"concurentQueue:%d===%@", i, [NSThread currentThread]);
        });
    }
}
 // 不创建线程
- (void)asyncmainQueue:(dispatch_queue_t)mainQueue {
    NSLog(@"异步主线程队列");
    for (int i = 0; i < 10; i++) {
        dispatch_async(mainQueue, ^{
            NSLog(@"concurentQueue:%d===%@", i, [NSThread currentThread]);
        });
    }
}
// 有多少任务创建多少线程
- (void)asyncGlobalQueue:(dispatch_queue_t)globalQueue {
    NSLog(@"异步全局队列");
    for (int i = 0; i < 10; i++) {
        dispatch_async(globalQueue, ^{
            NSLog(@"concurentQueue:%d===%@", i, [NSThread currentThread]);
            NSData *data = [NSData  dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
            dispatch_async(dispatch_get_main_queue(), ^{
                _imageView.image = [UIImage imageWithData:data];
            });
        });
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
